package com.zhupf.递归;

/**
 * @author zhupf
 * @date 2025年02月10日 10:42
 * @Description 390. 消除游戏
 * 列表 arr 由在范围 [1, n] 中的所有整数组成，并按严格递增排序。请你对 arr 应用下述算法：
 * <p>
 * 从左到右，删除第一个数字，然后每隔一个数字删除一个，直到到达列表末尾。
 * 重复上面的步骤，但这次是从右到左。也就是，删除最右侧的数字，然后剩下的数字每隔一个删除一个。
 * 不断重复这两步，从左到右和从右到左交替进行，直到只剩下一个数字。
 * 给你整数 n ，返回 arr 最后剩下的数字。
 */
public class LastRemaining {

    public static void main(String[] args) {
        LastRemaining lastRemaining = new LastRemaining();
        System.out.println(lastRemaining.lastRemaining(9));
    }


    public int lastRemaining(int n) {
        return process1(1, n, 1, n);
    }

    private int process1(int head, int tail, int intval, int size) {
        if (size == 1) {
            return head;
        }
        return process2(head + intval, size % 2 == 0 ? tail : tail - intval, intval * 2, size / 2);
    }

    private int process2(int head, int tail, int intval, int size) {
        if (size == 1) {
            return head;
        }
        return process1(size % 2 == 0 ? head : head + intval, tail - intval, intval * 2, size / 2);
    }


}
